//package com.dsfa.filter;
//
//import cn.hutool.core.date.DateTime;
//import com.alibaba.fastjson.JSONObject;
//import com.dsfa.biz.busCenter.BusService;
//import com.dsfa.biz.dataCenter.DataCenterService;
//import com.dsfa.biz.dataCenter.AgentLogWSDto;
//import com.dsfa.conf.Config;
//import com.dsfa.platform.starter.db.jfinal.plugin.activerecord.Record;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.codec.digest.DigestUtils;
//import org.apache.commons.lang3.StringUtils;
//import org.apache.cxf.binding.soap.SoapHeader;
//import org.apache.cxf.binding.soap.SoapMessage;
//import org.apache.cxf.headers.Header;
//import org.apache.cxf.helpers.DOMUtils;
//import org.apache.cxf.helpers.IOUtils;
//import org.apache.cxf.interceptor.Fault;
//import org.apache.cxf.message.Message;
//import org.apache.cxf.phase.AbstractPhaseInterceptor;
//import org.apache.cxf.phase.Phase;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.w3c.dom.Document;
//import org.w3c.dom.Element;
//
//import javax.servlet.http.HttpServletRequest;
//import javax.xml.namespace.QName;
//import java.io.ByteArrayInputStream;
//import java.io.IOException;
//import java.io.InputStream;
//import java.util.*;
//
///**
// * @Description: 入拦截器，鉴权校验等功能
// * @ClassName: WsVerifyInInterceptor
// * @Author: wangdm
// * @Date: 2024/1/22
// */
////已弃用
//@Slf4j
//public class WsVerifyInInterceptor extends AbstractPhaseInterceptor<SoapMessage> {
//    private BusService busServer;
//    private DataCenterService dataCenterService;
//
//    public WsVerifyInInterceptor() {
//        super(Phase.RECEIVE);
//        this.busServer = new BusService();
//        this.dataCenterService = new DataCenterService();
//        //this.redisExecute = new RedisExecute();
//    }
//
//    public WsVerifyInInterceptor(BusService busServer, DataCenterService dataCenterService) {
//        // 协议前进行拦截
//        //super(Phase.PRE_PROTOCOL);
//        super(Phase.RECEIVE);
//        this.busServer = busServer;
//        this.dataCenterService = dataCenterService;
//    }
//
//    @Override
//    public void handleMessage(SoapMessage message) throws Fault {
//        String logPre = "[WsVerifyInInterceptor] ws代理 ";
////        //初始化日志
////        AgentLogInit logInit = new AgentLogInit(wsContext.getMessageContext(), timestamp, logPre);
////        log.info("{} loginit over:{}", logPre, logInit);
//
//        //1、解析鉴权参数
//        String queStr = (String) message.get(Message.QUERY_STRING);
//        log.info("{}queStr：{} ", logPre, queStr);
//        if (queStr.startsWith("wsdl")) {
//            return;
//        }
//        if (queStr.contains("id=")) {
//            AgentLogWSDto aLogDto = null;
//            long timeStart = System.currentTimeMillis();
//            try {
//                Map<String, String> reqMap = new HashMap<>();
//                //HttpServletRequest request = (HttpServletRequest) message.get("HTTP.REQUEST");
//                String[] split = queStr.split("&");
//                for (int i = 0; i < split.length; i++) {
//                    String[] paras = split[i].split("=");
//                    if (paras.length > 1) {
//                        reqMap.put(paras[0], paras[1]);
//                    } else {
//                        reqMap.put(paras[0], "");
//                    }
//                }
//                log.info("{}id={},timestamp={},token={},app={},vcode={}",
//                        logPre, reqMap.get("id"), reqMap.get("timestamp"), reqMap.get("token"),
//                        reqMap.get("app"), reqMap.get("vcode"));
//                if (StringUtils.isAnyEmpty(reqMap.get("id"), reqMap.get("timestamp"), reqMap.get("token")
//                        , reqMap.get("app"), reqMap.get("vcode"))) {
//                    throw new Fault(new IllegalArgumentException("please check timestamp,token,app,vcode"));
//                }
//                //初始化记录日志
//                aLogDto = new AgentLogWSDto(reqMap.get("timestamp"), (HttpServletRequest) message.get("HTTP.REQUEST"));
//                aLogDto.setAppCode(reqMap.get("app"));
//                log.info("{}初始化日志：{}", logPre, aLogDto);
//                //2、鉴权
//                //  2.1、从业务中台获取对应appKey
//                Record appInfo = busServer.getAppInfoByCode(reqMap.get("app"));
//                aLogDto.setAppKey(appInfo.getStr("appKey"));
//                aLogDto.setAppName(appInfo.getStr("appName"));
//                log.info("{}获取对应appKey：{}", logPre, appInfo);
//
//                //验证
//                String verifyRes = verifyAuth(reqMap.get("timestamp"), reqMap.get("token")
//                        , reqMap.get("app"), reqMap.get("vcode"), appInfo.getStr("appKey"));
//                log.info("{}验证：{}", logPre, verifyRes);
//                aLogDto.setValid("ok".equals(verifyRes) ? 1 : 0);
//                aLogDto.setValidMsg(verifyRes);
//                if (!"ok".equals(verifyRes)) {
//                    throw new Fault(new IllegalArgumentException(verifyRes));
//                }
//                //3、 根据queMap.get("id")从数据库中读取代理的url
//                //String webUrl = "http://10.5.42.89:9998/mdm/ws/intfsServiceWS?wsdl";
//                Record tInfo = dataCenterService.getTargetInfoById(reqMap.get("id"));
//                String webUrl = tInfo.getStr("targetUrl");
//                if (StringUtils.isEmpty(webUrl)) {
//                    log.warn("{}未找到{}对应目标地址", logPre, reqMap.get("id"));
//                    throw new Fault(new IllegalArgumentException("未找到" + reqMap.get("id") + "对应目标地址"));
//                }
//                aLogDto.setReqInterfaceUrl(webUrl);
//                aLogDto.setReqServerInterfaceId(reqMap.get("id"));
//                aLogDto.setReqServerInterfaceName(tInfo.getStr("targetName"));
//                log.info("{}读取代理的url：{}", logPre, webUrl);
//                //4、解析修改包装流
//                // 从流中获取请求消息体并以字符串形式输出，注意IOUtils是cxf的包；
//                String input = null;
//                try {
//                    input = IOUtils.toString(message.getContent(InputStream.class), "UTF-8");
//                } catch (IOException e) {
//                    log.error("解析报文异常: {}", e.getMessage());
//                    e.printStackTrace();
//                    throw new Fault(new IllegalArgumentException(e.getMessage()));
//                }
//                aLogDto.setReqData(toJson("queStr", queStr, "input", input).toJSONString());
//                // 如果内容不为空（第一次连接也会被拦截，此时input为空）
//                String param = null;
//                if (StringUtils.isNotBlank(input)) {
//                    // 修改请求消息体为webservice服务要求的格式
//                    param = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:wss=\"http://wsServ.dsfa.com\">\n" +
//                            "   <soapenv:Header/>\n" +
//                            "   <soapenv:Body>\n" +
//                            "      <wss:wsServer>" +
//                            "         <queryData><![CDATA[" +
//                            input +
//                            "]]></queryData>\n" +
//                            "         <webUrl>" +
//                            webUrl +
//                            "</webUrl>\n" +
//                            "      </wss:wsServer>\n" +
//                            "   </soapenv:Body>\n" +
//                            "</soapenv:Envelope>";
//                } else {
//                    //throw null;
//                    return;
//                }
//                //5、重新写入
//                message.setContent(InputStream.class, new ByteArrayInputStream(param.getBytes()));
//                log.info("{}解析报文，重新写入：ok", logPre);
//            } catch (Exception e) {
//                log.error("解析报文异常: {}", e.getMessage());
//                e.printStackTrace();
//                if (aLogDto != null) {
//                    aLogDto.setRespTime((int) ((System.currentTimeMillis() - timeStart) / 1000));
//                    aLogDto.setRepData(e.getMessage());
//                    aLogDto.setReqEndTime(DateTime.now());
//                }
//                throw new Fault(new IllegalArgumentException(e.getMessage()));
//            } finally {
//                if (aLogDto != null) {
//                    //日志入库
//                    boolean b = dataCenterService.saveAgentWSLog(aLogDto.toAddRecord());
//                    log.info("{}日志入库：{}", logPre, b);
//                    //在header中添加id和开始时间，在输出时使用
//                    QName qNameID = new QName("logId");
//                    Document docID = DOMUtils.createDocument();
//                    Element elID = docID.createElement("logId");
//                    elID.setTextContent(aLogDto.getId());
//                    SoapHeader headerID = new SoapHeader(qNameID, elID);
//                    //添加开始时间
//                    QName qNameTimeStart = new QName("timeStart");
//                    Document docT = DOMUtils.createDocument();
//                    Element elT = docT.createElement("timeStart");
//                    elT.setTextContent(timeStart + "");
//                    SoapHeader headerT = new SoapHeader(qNameTimeStart, elT);
//
//                    //这样添加的header，在pre_stream时能获取到
//                    List<Header> headers = message.getHeaders();
//                    headers.add(headerID);
//                    headers.add(headerT);
//                }
//            }
//        }
//    }
//
//    /**
//     * @Description: 校验认证
//     * @Author: wangdm
//     * @Date: 2024/1/12
//     */
//    public String verifyAuth(String timestamp, String token, String app, String vcode, String appKey) {
//        String preStr = "[Verify] [verifyAuth] ";
//        log.info("{}timestamp={},token={},app={},vcode={}",
//                preStr, timestamp, token, app, vcode);
//        if (StringUtils.isEmpty(timestamp)) {
//            return "timestamp is null";
//        }
//
//        /*//验证规则
//        //1、timestamp在 5 * 60000 五分钟之内
//        // 创建 Calendar 对象并设置时区为东八区
//        Calendar calendar = Calendar.getInstance();
//        TimeZone timeZone = TimeZone.getTimeZone("GMT+8");
//        calendar.setTimeZone(timeZone);
//        // 获取东八区的时间戳
//        long time8 = calendar.getTimeInMillis() / 1000L * 1000L;
//        System.out.println("东八区时间戳：" + time8);
//        //与服务器时区不同，先不管时间
//        //long time = System.currentTimeMillis();
//        long sjc = time8 - Long.parseLong(timestamp);
//        if (sjc < 5 * 60000 && sjc > 0) {
//            log.info("{}token timeout", preStr);
//            return "token timeout";
//        }
//        //2、在业务库中根据app（appcode）获取appkey
//        //appKey=busServer.getAppKeyByCode(app);
//        if ("".equals(appKey)) {
//            log.info("{}app不存在", preStr);
//            return "app不存在";
//        }
//        //3、redis 判断token是否已使用
//        //token在24小时内只能使用一次
//        RedisExecute redis = SpringContextHolder.getBean(RedisExecute.class);
//        if (redis.hasKey("24-" + token)) {
//            log.info("{}token失效：{}", preStr, token);
//            return "token失效";
//        } else {
//            redis.set("24-" + token, 1, 24 * 3600);
//        }*/
//        //3、判断vcode==md5(timestamp+appcode+token+appkey)
//        //TODO token 记入redis，同一个token值不能在24小时内重复使用
//        String d5 = DigestUtils.md5Hex(timestamp + app + token + appKey);
//        if (StringUtils.isEmpty(vcode) || !vcode.equals(d5)) {
//            log.info("{}token doesn't exist verify failed", preStr);
//            return "token doesn't exist verify failed";
//        }
//        log.info("{}OK timestamp={},token={},app={},vcode={}",
//                preStr, timestamp, token, app, vcode);
//        return "ok";
//    }
//
//    /**
//     * @Description: 转换成json 必须这样传参 “name”，“value”
//     * @ClassName: IntfsServiceWSImplPortImpl
//     * @Author: wangdm
//     * @Date: 2024/1/16
//     */
//    public static JSONObject toJson(Object... str) {
//        JSONObject js = new JSONObject();
//        for (int i = 0; i < str.length; i++) {
//            js.put(str[i].toString(), str[i + 1]);
//            i++;
//        }
//        return js;
//    }
//}
